/**
 * eCommerce Application Sample for J2EE Training
 * Implementation of EcomAdminBean
 * @author Fabienne Boyer - Didier Donsez
 * may 2006
 */
package ecom.session;

import ecom.exception.EcomException;
import ecom.dao.AccountDAO;
import ecom.dao.AdressDAO;
import ecom.dao.CategoryDAO;
import ecom.dao.CountryDAO;
import ecom.dao.CustomerDAO;
import ecom.dao.ProductDAO;
import ecom.dao.ProductStoreDAO;
import ecom.dao.StoreDAO;
import ecom.entity.Account;
import ecom.entity.Adress;
import ecom.entity.Category;
import ecom.entity.Country;
import ecom.entity.Customer;
import ecom.entity.Product;
import ecom.entity.ProductStore;
import ecom.entity.Store;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Remote;
import javax.ejb.Stateful;

@Stateful
@Remote(EcomAdminRemote.class)
public class EcomAdminBean extends EcomGenericBean implements EcomAdminRemote {

    /********** METHODE POUR LES ACCOUNT
     * createAccount
     * listAccount
     * modifyAccount
     * deleteAccount
     */
    /**
     *
     * @param iban : iban du compte
     * @param accountOwner : correspond au nom + prenom dans le cas d'un client, ou du nom du magazin dans le cas d'un store
     * @param balance : balance du compte
     */
    @Override
    public void createAccount(String iban, String accountOwner, double balance) throws EcomException {
        //Creation de l'Account
        Account account = new Account();
        account.setIban(iban);
        account.setBalance(Double.valueOf(balance));

        // Creation du DAO pour creer le compte
        AccountDAO accountDao = new AccountDAO();
        accountDao.create(account);


        // mise a jour de l'utilisateur qui possede le nouveau compte
        CustomerDAO customerDao = new CustomerDAO();
        Customer c = customerDao.findByName(accountOwner);

        if (null == c) {
            // il s'agit d'un store
            throw new EcomException("On ne peut pas encore ajouter de compte pour un store");
        } else {
            // il s'agit d'un customer
            c.setAccount(account);
            customerDao.saveOrUpdate(c);
        }

        accountDao.closeSession();
        customerDao.closeSession();
    }
    
    @Override
    public void createCategory(String label, String description) throws EcomException {
        //Creation de l'Account
        Category category = new Category();
        category.setLabel(label);
        category.setDescription(description);
        
       

        // Creation du DAO pour creer le compte
        CategoryDAO categoryDao = new CategoryDAO();
        categoryDao.create(category);
        

        categoryDao.closeSession();

    }
    
    @Override
    public void deleteCategory(int id) {
        Category c = null;
        CategoryDAO categoryDao = new CategoryDAO();

        c = categoryDao.find(id);
        categoryDao.delete(c);
        categoryDao.closeSession();

    }

    @Override
    /**
     * List
     */
    public List<Account> listAccount() {
        AccountDAO accountDao = new AccountDAO();
        List<Account> accountList = accountDao.findAll();
        accountDao.closeSession();

        return accountList;
    }

    @Override
    /**
     * List
     */
    public Account getAccountByIban(String iban) {
        AccountDAO accountDao = new AccountDAO();
        Account account = accountDao.findByIban(iban);
        accountDao.closeSession();

        return account;
    }

    @Override
    /**
     * List
     */
    public Account getAccountById(int id) {
        AccountDAO accountDao = new AccountDAO();
        Account account = accountDao.find(id);
        accountDao.closeSession();

        return account;
    }

    @Override
    /**
     * Permet de modifier la balance d'un compte a partir de son iban
     */
    public void modifyAccount(int id, String iban, double balance) {
        AccountDAO accountDao = new AccountDAO();
        Account account = accountDao.find(id);
        account.setIban(iban);
        account.setBalance(balance);
        accountDao.update(account);
        accountDao.closeSession();
    }

    @Override
    public void deleteAccount(int id) {
        Account a = null;
        AccountDAO accountDao = new AccountDAO();

        a = accountDao.find(id);
        accountDao.delete(a);
        accountDao.closeSession();

    }

    /********** METHODE POUR LES STORES
     * createStore
     * listStore
     * modifyStore
     * deleteStore
     */
    /**
     *  Créer un magasin à partir de son nom
     * @param name 
     */
    public void createStore(String name) {
        //Creation de l'Account
        Account account = new Account();
        Integer idAccount =0;
        account.setIdAccount(idAccount);
        
        
        //Création du store
        Store store = new Store();
        store.setName(name);
        store.setAccount(account);
        
        

        // Creation du DAO pour creer le compte
        StoreDAO storeDAO = new StoreDAO();
        storeDAO.create(store);

        //fermeture des sessions
        storeDAO.closeSession();

    }

    @Override
    public void modifyStore(Integer storeId, String newNameStore) {
        //Recherche du store correspondant à l'id
        Store store = new Store();

        //Création des dao
        StoreDAO storeDAO = new StoreDAO();
        store = storeDAO.find(storeId);

        //changement
        store.setName(newNameStore);

        //transaction
        storeDAO.update(store);

        //fermeture des transactions
        storeDAO.closeSession();

    }
    
    @Override
    public void associateProductToStore(int productId, int storeId, int stock, Double price) throws EcomException {
       Store store = new Store();
       Product product = new Product();
       StoreDAO storeDAO = new StoreDAO();
       ProductDAO productDAO = new ProductDAO();
       
       
       store = storeDAO.findByIdStore(storeId);
       product = productDAO.findById(productId);
       
       if(null == store) {
           throw new EcomException("le Store avec l'id "+storeId+" n'existe pas");
       } else if(null == product) {
           throw new EcomException("le Product avec l'id "+productId+" n'existe pas");
       } else {
           ProductStore productStore = new ProductStore(storeId, productId);
           ProductStoreDAO productStoreDAO = new ProductStoreDAO();
           productStore.setPrice(price);
           productStore.setStock(stock);
           productStoreDAO.create(productStore);
           productStoreDAO.closeSession();
       } 
       
       productDAO.closeSession();
       storeDAO.closeSession();
       
    }

    @Override
    public void associateAccountToStore(Integer storeId, Integer accountID) {
        //Recherche du store correspondant à l'id
        Store store = new Store();
        StoreDAO storeDAO = new StoreDAO();
        store = storeDAO.find(storeId);

        //recherche du compte
        Account account =  new Account();
        AccountDAO accountDAO = new AccountDAO();
        account = accountDAO.find(accountID);
        
        //association du compte au store
        store.setAccount(account) ;

        //transaction
        storeDAO.update(store);

        //fermeture des transactions
        storeDAO.closeSession();

    }

    /**
     * Supprime un magasin a partir de son ID
     * @param storeId 
     */
    @Override
    public void deleteStore(Integer storeId) {

        //Recherche du store correspondant à l'id
        Store store = new Store();

        //Création des dao
        StoreDAO storeDAO = new StoreDAO();
        store = storeDAO.find(storeId);

        //suprresion du store
        storeDAO.delete(store);

        //Fermeture des transaction
        storeDAO.closeSession();

    }

    public void createProduct(String productName, String description, int categoryId) throws EcomException {
        Product product = new Product();
        ProductDAO productDAO = new ProductDAO();
        CategoryDAO categoryDAO = new CategoryDAO();
        product.setName(productName);
        product.setDescription(description);

        Category category = categoryDAO.findByIdCategory(categoryId);

        if (null == category) {
            throw new EcomException("La categorie n'existe pas");
        } else {
            // il s'agit d'un customer
            product.setCategory(category);
            productDAO.create(product);
        }
        categoryDAO.closeSession();
        productDAO.closeSession();

    }

    /********** METHODE POUR LES CUSTOMERS
     * createCustomer
     * listCustomer
     * modifyCustomer
     * deleteCustomer
     */
    @Override
    public List<Customer> listCustomer() {
        List<Customer> customerList  = new ArrayList();
        CustomerDAO customerDao = new CustomerDAO();
        customerList = customerDao.findAll();
        customerDao.closeSession();

        return customerList;
    }

    /**
     * Permet de creer un customer a partir d'un compte existant
     * @param lastName
     * @param firstName
     * @param email
     * @param password
     * @param street
     * @param zipCode
     * @param city
     * @param countryId
     * @param idAccount
     * @throws EcomException 
     */
    @Override
    public void createCustomer(String lastName, String firstName, String email, String password, String street, String zipCode, String city, int countryId, int idAccount) throws EcomException {
        // Declarations des DAOs
        CustomerDAO customerDAO = new CustomerDAO();
        AdressDAO adressDAO = new AdressDAO();
        AccountDAO accountDAO = new AccountDAO();

        // Creation des references de l'objet customer
        Customer customer = new Customer();
        Adress adress = new Adress();
        List<Adress> adressList = new ArrayList();

        adress.setCity(city);
        adress.setStreet(street);
        adress.setZipcode(zipCode);
        adress.setCountry(new Country(countryId));

        adressList.add(adress);

        customer.setFirstName(firstName);
        customer.setLastName(lastName);
        customer.setEmail(email);
        customer.setPassword(password);
        customer.setAdressList(adressList);
        
        Account a= accountDAO.find(idAccount);

        if (null == a) {
            throw new EcomException("L'account n'existe pas");
        } else {
            // Debut des transactions
            customer.setAccount(a);
            adressDAO.create(adress);
            customerDAO.create(customer);
        }
        // fermeture des session
        adressDAO.closeSession();
        customerDAO.closeSession();
    }
    
    /**
     * Permet de creer un customer y compris le compte
     * @param lastName
     * @param firstName
     * @param email
     * @param password
     * @param street
     * @param zipCode
     * @param city
     * @param countryId
     * @param iban
     * @param balance
     * @throws EcomException 
     */
    public void createCustomer(String lastName, String firstName, String email, String password, String street, String zipCode, String city, int countryId, String iban, double balance) {
        // Declarations des DAOs
        CustomerDAO customerDAO = new CustomerDAO();
        AdressDAO adressDAO = new AdressDAO();
        AccountDAO accountDAO = new AccountDAO();

        // Creation des references de l'objet customer
        Customer customer = new Customer();
        Adress adress = new Adress();
        List<Adress> adressList = new ArrayList();
        Account account = new Account();
        
        adress.setCity(city);
        adress.setStreet(street);
        adress.setZipcode(zipCode);
        adress.setCountry(new Country(countryId));

        adressList.add(adress);
        
        account.setIban(iban);
        account.setBalance(balance);

        customer.setFirstName(firstName);
        customer.setLastName(lastName);
        customer.setEmail(email);
        customer.setPassword(password);
        customer.setAdressList(adressList);
        customer.setAccount(account);

        // Debut des transactions
        accountDAO.create(account);
        adressDAO.create(adress);
        customerDAO.create(customer);
        
        // fermeture des session
        adressDAO.closeSession();
        customerDAO.closeSession();
    }

    @Override
    public void modifyCustomer(String lastName, String firtName, String email) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void deleteCustomer(int id) {
        Customer c = null;
        CustomerDAO customerDao = new CustomerDAO();

        c = customerDao.find(id);
        customerDao.delete(c);
        customerDao.closeSession();
    }

    @Override
    public void addAdressToCustomer(Customer c) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    /**
     * Permet de lister les country afin de saisir la totalite de l'adresse pour la creation d'un customer
     */
    public List<Country> listCountry() {
        List<Country> countryList = null;
        CountryDAO dao = new CountryDAO();
        countryList = dao.findAll();
        return countryList;
    }

    @Override
    public List<Product> listProducts() {
        List<Product> productList = null;
        ProductDAO productDAO = new ProductDAO();
        productList = productDAO.findAll();
        productDAO.closeSession();
        return productList;
    }

    /**
     * liste les produits d'un store
     * @param idStore
     * @return la liste des produits d'un store
     */
    @Override
    public List<ProductStore> listProductsStore(int idStore) {
        List<ProductStore> productStoreList = null;
        ProductStoreDAO productStoreDAO = new ProductStoreDAO();
        productStoreList = productStoreDAO.findProductsByStore(idStore);
        productStoreDAO.closeSession();
        return productStoreList;
    }

    /**
     * Liste les produits d'un catégorie
     * @param idCategory
     * @return une liste de produit
     */
    @Override
    public List<Product> listProductsByCategory(int idCategory) {
        List<Product> productList = null;
        ProductDAO productDAO = new ProductDAO();
        productList = productDAO.findAllByCategory(idCategory);
        productDAO.closeSession();
        return productList;
    }

    @Override
    /**
     * Liste toutes les catégories
     */
    public List<Category> listCategory() {
        CategoryDAO categoryDao = new CategoryDAO();
        List<Category> categoryList = categoryDao.findAll();
        categoryDao.closeSession();

        return categoryList;
    }

    @Override
    /**
     * Retourne la catégorie en fonction de l'id
     */
    public Category findCategory(int idCategory) {
        CategoryDAO categoryDao = new CategoryDAO();
        Category category = categoryDao.find(idCategory);
        categoryDao.closeSession();

        return category;
    }
}
